package com.blog.cloud.api.dto;

import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

import java.io.Serial;
import java.io.Serializable;

@Getter
@Setter
@Accessors(chain = true)
public class ProductDTO implements Serializable {
    @Serial
    private static final long serialVersionUID = 4903046415310678274L;

    private Long id;
    private String name;
    private String description;
    @NotNull(message = "Order ID must not be null.")
    private double price;
    @Positive(message = "数量必须为正数.")
    private int quantity;
}

// DTO（Data Transfer Object）是一种输入数据对象，用于在应用程序中传递数据。常作为参数传递。
// 关于数据校验的使用参考 SpringBoot 官方文档： https://docs.spring.io/spring-boot/reference/io/validation.html

// 减少网络传输负担：DTO通常用于远程调用或微服务间通信。它们可以只包含真正需要传输的数据，从而减少网络传输的负担，提高系统性能。
// 防止敏感数据泄露：使用DTO和VO可以控制哪些数据暴露给外部或前端，从而减少敏感数据泄露的风险。
// 数据隔离：通过DTO和VO，可以确保只有经过验证的数据才能被处理，从而增强系统的安全性。


// 在 MVC 模式中，DTO 通常用于处理客户端请求的数据，比如用户输入、表单数据等。前端提交给后端的数据，通常都是 DTO。
// 而在微服务架构中，DTO 通常用于服务间通信，比如服务 A 调用服务 B 的接口，服务 B 接收到请求后，会将请求参数封装成 DTO 并返回给服务 A。
// 因此，DTO 在微服务架构中扮演着重要的角色，它可以有效地减少网络传输的负担，提高系统性能，并防止敏感数据泄露。

// 总结：DTO 使用场景主要有两个，一个是 MVC 模式，另一个是微服务架构。
// 在 MVC 模式中，DTO 通常用于处理客户端请求的数据，比如用户输入、表单数据等。
// 在微服务架构中，DTO 通常用于服务间通信（OpenFeign），比如服务 A 调用服务 B 的接口，服务 B 接收到请求后，会将请求参数封装成 DTO 并返回给服务 A。


// 使用Spring Validation框架的校验注解（如JSR 303/JSR 349规范中的注解）时，通常将这些注解添加到DTO（Data Transfer Object）对象中。
// 这是因为DTO通常用于接收外部输入的数据，并且在业务逻辑处理之前需要进行数据校验。